/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.ui.actions;

import com.architexa.org.eclipse.gef.EditPart;
import com.architexa.org.eclipse.gef.Request;
import com.architexa.org.eclipse.gef.RequestConstants;
import com.architexa.org.eclipse.gef.internal.GEFMessages;

import org.eclipse.swt.widgets.Display;

import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;


/**
 * An action to perform direct editing on a selected part. The DirectEditAction provides
 * the function of sending a <code>Request</code> of the type {@link
 * RequestConstants#REQ_DIRECT_EDIT} to a single EditPart. The request will be sent to the
 * editpart using {@link com.architexa.org.eclipse.gef.EditPart#performRequest(Request)}.
 * <P>
 * This action will be enabled whenever the current selection is one EditPart, and that
 * editpart returns <code>true</code> for {@link EditPart#understandsRequest(Request)},
 * using the {@link #getDirectEditRequest()}.
 * <P>
 * Clients can control the request that is sent by calling {@link
 * #setDirectEditRequest(Request)}. The {@link com.architexa.org.eclipse.gef.requests.DirectEditRequest}
 * class allows the client to specify the <i>feature</i> that should be edited when
 * invoked.
 * @author hudsonr
 */
public class DirectEditAction
	extends SelectionAction
{

/** @deprecated */
public static final String ID = GEFActionConstants.DIRECT_EDIT;

private Request directEditRequest = new Request(RequestConstants.REQ_DIRECT_EDIT);

/**
 * Same as {@link #DirectEditAction(IWorkbenchPart)}.
 * @param editor the editor
 */
public DirectEditAction(IEditorPart editor) {
	this((IWorkbenchPart)editor);
}

/**
 * Constructs a DirectEditAction using the specified part.
 * @param part the workbench part
 */
public DirectEditAction(IWorkbenchPart part) {
	super(part);
}

/**
 * returns <code>true</code> if there is exactly 1 EditPart selected that understand
 * a request of type: {@link RequestConstants#REQ_DIRECT_EDIT}.
 * @return <code>true</code> if enabled
 */
protected boolean calculateEnabled() {
	if (getSelectedObjects().size() == 1
	  && (getSelectedObjects().get(0) instanceof EditPart)) {
		EditPart part = (EditPart)getSelectedObjects().get(0);
		return part.understandsRequest(getDirectEditRequest());
	}
	return false;
}

/**
 * Returns the <code>Request</code> being used.
 * @return the request
 */
protected Request getDirectEditRequest() {
	return directEditRequest;
}

/**
 * @see org.eclipse.jface.action.IAction#run()
 */
public void run() {
	try {
		EditPart part = (EditPart)getSelectedObjects().get(0);
		part.performRequest(getDirectEditRequest());
	} catch (ClassCastException e) {
		Display.getCurrent().beep();
	} catch (IndexOutOfBoundsException e) {
		Display.getCurrent().beep();
	}
}

/**
 * Clients may override the request that is used to perform the direct edit.
 * @param req the new request to be used
 */
public void setDirectEditRequest(Request req) {
	directEditRequest = req;
}

/**
 * @see com.architexa.org.eclipse.gef.ui.actions.WorkbenchPartAction#init()
 */
protected void init() {
	super.init();
	setText(GEFMessages.RenameAction_Label);
	setToolTipText(GEFMessages.RenameAction_Tooltip);
	setId(GEFActionConstants.DIRECT_EDIT);
}


}
